﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Xml.Linq;

namespace EveMarkets
{
	public class InformationsMap
	{
		private const string URL_MAP_KILL = @"https://api.eveonline.com/map/Kills.xml.aspx";
		private const string URL_JUMP_MAP = @"https://api.eveonline.com/map/Jumps.xml.aspx";

		//  solarSystemID="30001343" shipKills="0" factionKills="17" podKills="0" 
		private static List<Tuple<int,int,int,int>> _mapKill = new List<Tuple<int, int, int, int>>();

		// <row solarSystemID="30001082" shipJumps="15"/>
		private static SortedDictionary<int,int> _jumpMap = new SortedDictionary<int, int>();

		/// <summary>
		/// 
		/// </summary>
		public static List<Tuple<int, int, int, int>> ContexteMapKill
		{
			get
			{
				// Variables locales.
				List<Tuple<int, int, int, int>> infoXmlEveOnline = null;

				infoXmlEveOnline = _mapKill.Count().Equals(0) ? CreerLaMapKill() : _mapKill;

				return infoXmlEveOnline;
			}
		}

		/// <summary>
		/// 
		/// </summary>
		public static SortedDictionary<int, int> ContexteJump
		{
			get
			{
				// Variables locales.
				SortedDictionary<int, int> infoXmlEveOnline = null;

				infoXmlEveOnline = _jumpMap.Count().Equals(0) ? CreerListJump() : _jumpMap;

				return infoXmlEveOnline;
			}
		}

		private static SortedDictionary<int, int> CreerListJump()
		{
			// Création d'un objet WebClient (c'est lui qui permet de télécharger un fichier)
			WebClient wc = new WebClient();
			string downloadString = String.Empty;

			try
			{
				// Lancement du téléchargement
				// argument 1 : url du fichier source
				// argument 2 : l'emplacement ou enregistrer le fichier sur le disque dur
				downloadString = wc.DownloadString(URL_JUMP_MAP);
			}
			catch (Exception e)
			{
				// Destruction de l'objet WebClient
				wc.Dispose();
			}
			finally
			{
				// Destruction de l'objet WebClient
				wc.Dispose();
			}

			// Convertion en XDoc.
			XDocument xmlJumpMap = XDocument.Parse(downloadString);

			// Exemple de flux
			// <rowset name="solarSystems" key="solarSystemID" columns="solarSystemID,shipJumps">
			//	<row solarSystemID="30001082" shipJumps="15"/>

			var listJump = xmlJumpMap.Descendants("row").Select(x => x);
			SortedDictionary<int, int> retourInfo = new SortedDictionary<int, int>();
			foreach (var row in listJump)
			{
				int solarID = Convert.ToInt32(row.Attribute("solarSystemID").Value);
				int shipJumps = Convert.ToInt32(row.Attribute("shipJumps").Value);

				retourInfo.Add(solarID,shipJumps);
			}

			return retourInfo;
		}


		private static List<Tuple<int, int, int, int>> CreerLaMapKill()
		{
			// Création d'un objet WebClient (c'est lui qui permet de télécharger un fichier)
			WebClient wc = new WebClient();
			string downloadString = String.Empty;

			try
			{
				// Lancement du téléchargement
				// argument 1 : url du fichier source
				// argument 2 : l'emplacement ou enregistrer le fichier sur le disque dur
				downloadString = wc.DownloadString(URL_MAP_KILL);
			}
			catch (Exception e)
			{
				// Destruction de l'objet WebClient
				wc.Dispose();
			}
			finally
			{
				// Destruction de l'objet WebClient
				wc.Dispose();
			}

			// Convertion en XDoc.
			XDocument xmlKillMap = XDocument.Parse(downloadString);

			// Exemple de flux.
			//  <rowset name="solarSystems" key="solarSystemID" columns="solarSystemID,shipKills,factionKills,podKills">
			//		<row solarSystemID="30001343" shipKills="0" factionKills="17" podKills="0" />

			var listRow = xmlKillMap.Descendants("row").Select(x => x);
			List<Tuple<int, int, int, int>> retourListe = new List<Tuple<int, int, int, int>>(listRow.Count());
			foreach (var row in listRow)
			{
				int idSolar = Convert.ToInt32(row.Attribute("solarSystemID").Value);
				int shipKill = Convert.ToInt32(row.Attribute("shipKills").Value);
				int npcKill = Convert.ToInt32(row.Attribute("factionKills").Value);
				int podKill = Convert.ToInt32(row.Attribute("podKills").Value);

				Tuple<int, int, int, int> tempTuple = new Tuple<int, int, int, int>(idSolar,shipKill,npcKill,podKill);

				retourListe.Add(tempTuple);
			}

			return retourListe;
		}
	}
}
